#include <iostream>
#include <thread>
#include <unistd.h>
using namespace std;

void fun()
{
    while(true)
    {
        cout << "hello new thread" << endl;
        sleep(1);
    }
}

int main()
{
    std::thread t(fun);
    std::thread t1(fun);
    std::thread t2(fun);
    std::thread t3(fun);
    std::thread t4(fun);

    while(true)
    {
        cout << "hello main thread" << endl;
        sleep(1);
    }

    t.join();
}

// __thread int g_val = 0;

// void *threadRun(void *args)
// {
//     pthread_detach(pthread_self());

//     const string name = (char *)args;
//     while (true)
//     {
//         //cout << name << ", pid: " << getpid() << " tid: " << pthread_self() << endl;
//         cout << name << " -> g_val: " << g_val++ << " &g_val: " << &g_val << endl;
//         sleep(5);
//         pthread_exit((void*)777);
//     }
// }

// int main()
// {
//     pthread_t tid;
//     pthread_create(&tid, nullptr, threadRun, (void*)"thread 1");
//     int cnt = 0;
//     while (true)
//     {
//         cout << "main thread -> g_val: " << g_val++ << " &g_val: " << &g_val << endl;
//         sleep(1);
//         if(cnt++ == 5)
//         {
//             break;
//         }
//     }

//     int *ret = nullptr; // 新线程自己分离了，但是主线程非要等待呢？
//     int n = pthread_join(tid, (void **)&ret); // 默认会阻塞等待新线程退出
//     if(n == 0)
//     {
//         cout << "main quit ...: new thead quit : " << (long long)ret << endl;
//     }
//     else
//     {
//         cout << "n :" << n << " errstring: " << strerror(n) << endl;
//     }
//     // linux下64位的，指针是8个字节，所以强转成long long 8个字节
//     return 0;
// }

// void *threadRun(void *args)
// {
//     const string name = (char *)args;
//     while (true)
//     {
//         cout << name << ", pid: " << getpid() << endl;
//         sleep(1);
//         static int cnt = 0;
//         if (cnt++ == 7)
//         {
//             // int *p = nullptr;
//             // *p = 777;
//             // exit(10);

//             return nullptr;
//             //pthread_exit(nullptr);
//         }
//     }
// }

// int main()
// {
//     // pthread_t tid[5];
//     // char name[64];
//     // for (int i = 0; i < 5; i++)
//     // {
//     //     snprintf(name, sizeof(name), "%s-%d", "thread", i); // 特定内容格式化到name中
//     //     pthread_create(tid + i, nullptr, threadRun, (void *)name);
//     //     sleep(1); // 缓解传参的bug
//     // }

//     pthread_t tid;
//     pthread_create(&tid, nullptr, threadRun, (void*)"thread 1");

//     while (true)
//     {
//         cout << "main thread, pid: " << getpid() << endl;
//         sleep(1);
//     }
//     return 0;
// }


// int g_val = 100;

// void show()
// {
//     cout << "show , pid: " << getpid() << " "
//          << "g_val: " << g_val++ << " &g_val: " << &g_val << endl;
// }

// void *threadRun(void *args)
// {
//     const string name = (char *)args;
//     while (true)
//     {
//         cout << name << ", pid: " << getpid() << "g_val: " << g_val++ << " &g_val: " << &g_val << endl;
//         show();
//         sleep(1);
//         static int cnt = 0;
//         if (cnt++ == 7)
//         {
//             int *p = nullptr;
//             *p = 777;
//         }
//         cnt++;
//     }
// }

// int main()
// {
//     pthread_t tid[5];
//     char name[64];
//     for (int i = 0; i < 5; i++)
//     {
//         snprintf(name, sizeof(name), "%s-%d", "thread", i); // 特定内容格式化到name中
//         pthread_create(tid + i, nullptr, threadRun, (void *)name);
//         sleep(1); // 缓解传参的bug
//     }
//     pthread_t tid;
//     pthread_create(&tid, nullptr, threadRun, (void*)"thread 1");

//     while (true)
//     {
//         cout << "main thread, pid: " << getpid() << "g_val: " << g_val++ << " &g_val: " << &g_val << endl;
//         show();
//         sleep(1);
//     }
//     return 0;
// }

// void *threadRun(void *args)
// {
//     const string name = (char*)args;
//     while(true)
//     {
//         cout << name << ", pid: " << getpid() << endl;
//         sleep(1);
//     }
// }

// int main()
// {
//     pthread_t tid;
//     pthread_create(&tid, nullptr, threadRun, (void*)"thread 1");

//     while(true)
//     {
//         cout << "main pthread pid: " << getpid() << endl;
//         sleep(1);
//     }

//     return 0;
// }

// int x = 100;
